home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume90 / util / rm < prev    next >
Encoding:
Internet Message Format  |  1990-01-28  |  20.7 KB

  1. Path: xanth!cs.odu.edu!Amiga-Request
  2. From: Amiga-Request@cs.odu.edu (Amiga Sources/Binaries Moderator)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v90i032: rm - delete substitute that allows file recovery, Part01/01
  5. Message-ID: <11139@xanth.cs.odu.edu>
  6. Date: 28 Jan 90 19:40:37 GMT
  7. Sender: tadguy@cs.odu.edu
  8. Reply-To: mjl@alison.at (Martin J. Laubach)
  9. Lines: 846
  10. Approved: tadguy@cs.odu.edu (Tad Guy)
  11. X-Mail-Submissions-To: Amiga@cs.odu.edu
  12.  
  13. Submitted-by: mjl@alison.at (Martin J. Laubach)
  14. Posting-number: Volume 90, Issue 032
  15. Archive-name: util/rm
  16.  
  17.   Here comes rm, a delete substitute "plus" -- since I've heard (read)
  18. some pleas for something like it lately, here it is. It moves the files
  19. to a temp directory instead of immediately deleting them. Should you
  20. accidentally remove something important, it thus can be recovered. See
  21. the included docs for more details.
  22.  
  23. [ uuencoded executable enclosed.  ...tad ]
  24.  
  25. #!/bin/sh
  26. # This is a shell archive.  Remove anything before this line, then unpack
  27. # it by saving it into a file and typing "sh file".  To overwrite existing
  28. # files, type "sh file -c".  You can also feed this as standard input via
  29. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  30. # will see the following message at the end:
  31. #        "End of archive 1 (of 1)."
  32. # Contents:  makefile purge rm.asm rm.doc rm.uu
  33. # Wrapped by tadguy@xanth on Sun Jan 28 14:40:28 1990
  34. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  35. if test -f 'makefile' -a "${1}" != "-c" ; then 
  36.   echo shar: Will not clobber existing file \"'makefile'\"
  37. else
  38. echo shar: Extracting \"'makefile'\" \(155 characters\)
  39. sed "s/^X//" >'makefile' <<'END_OF_FILE'
  40. XINCLUDE = inc:include.i
  41. X
  42. X.asm.o:
  43. X    casm -a $*.asm -o $*.o -i $(INCLUDE) -c qrv
  44. X
  45. Xrm:    rm.o
  46. X    blink rm.o to rm lib lib:arpnb.lib lib:amiga.lib sc sd verbose nd
  47. END_OF_FILE
  48. if test 155 -ne `wc -c <'makefile'`; then
  49.     echo shar: \"'makefile'\" unpacked with wrong size!
  50. fi
  51. # end of 'makefile'
  52. fi
  53. if test -f 'purge' -a "${1}" != "-c" ; then 
  54.   echo shar: Will not clobber existing file \"'purge'\"
  55. else
  56. echo shar: Extracting \"'purge'\" \(536 characters\)
  57. sed "s/^X//" >'purge' <<'END_OF_FILE'
  58. X.key drive
  59. X.bra [
  60. X.ket ]
  61. X
  62. Xif [drive]~ eq ~
  63. X  purge DH0:
  64. X  purge DH1:
  65. Xelse
  66. X  info [drive] | search STDIN [drive] | read num drive size used free per errs stat name
  67. X  delete >nil: [drive]Junk/#? all quiet
  68. X  info [drive] | search STDIN [drive] | read num drive size used1 free1 per1 errs stat name
  69. X
  70. X  rx "parse value '${per1}' || '${per}' with p1 '%' p '%'; say 'Purged ${drive} (${name}, ${size}) -- Usage went from ${per} to ${per1} ('p1-p'%).'"
  71. X
  72. X  diff= num= drive= size= used= free= per= errs= stat= name= used1= free1=
  73. X  per1=
  74. Xendif
  75. X
  76. END_OF_FILE
  77. if test 536 -ne `wc -c <'purge'`; then
  78.     echo shar: \"'purge'\" unpacked with wrong size!
  79. fi
  80. # end of 'purge'
  81. fi
  82. if test -f 'rm.asm' -a "${1}" != "-c" ; then 
  83.   echo shar: Will not clobber existing file \"'rm.asm'\"
  84. else
  85. echo shar: Extracting \"'rm.asm'\" \(6702 characters\)
  86. sed "s/^X//" >'rm.asm' <<'END_OF_FILE'
  87. X;- :ts=12 --------------------------------------------------------
  88. X;
  89. X;      rm -- remove files with Oops! possibility
  90. X;
  91. X;    /|||\          (c) Copyright 1989 by Martin J. Laubach
  92. X;   //|||\\            All rights reserved
  93. X;  ///|||\\\
  94. X;
  95. X;-----------------------------------------------------------------
  96. X
  97. X    ifd CAPE
  98. X    optimon
  99. X    addsym
  100. X    objfile "rm.o"
  101. X    endc
  102. X
  103. X    include "exec/types.i"
  104. X    include "exec/alerts.i"
  105. X    include "exec/libraries.i"
  106. X    include "libraries/dos.i"
  107. X    include "arp/arpbase.i"
  108. X
  109. Xcall    macro
  110. X    ifnd    _LVO\1
  111. X    xref    _LVO\1
  112. X    endc
  113. X    jsr    _LVO\1(a6)
  114. X    endm
  115. X
  116. X    xref    _LVOAlert
  117. X
  118. XScratchSiz:    equ    256
  119. XJunkSiz:    equ    80
  120. X
  121. X    section    Remove,code
  122. X
  123. X;---------------------------------------------------------------------------
  124. X; Try to open arp.library first. Write NoArp text if failure
  125. X
  126. Xmain:    RESIDENT    3000
  127. X
  128. X    movem.l    a0/d0,-(a7)
  129. X
  130. X    move.l    4,a6
  131. X    lea    ArpN(pc),a1
  132. X    moveq    #34,d0
  133. X    call    OpenLibrary
  134. X    tst.l    d0
  135. X    bne.s    ArpOK
  136. X    lea    DosN(pc),a1
  137. X    moveq    #34,d0
  138. X    call    OpenLibrary
  139. X    tst.l    d0
  140. X    bne.s    DosOK
  141. X
  142. X;-------------------------------------
  143. X; Recoverable alert if no dos.library found
  144. X
  145. XalertDos:    ALERT    (AG_OpenLib!AO_DOSLib)
  146. X
  147. XEFail:    moveq    #RETURN_FAIL,d0
  148. X    rts
  149. X
  150. X;-------------------------------------
  151. X; Write OhAhNoArp text for user without arp.library
  152. X; Expects DOSBase in D0
  153. X
  154. XDosOK:    move.l    d0,a6
  155. X    call    Output
  156. X    move.l    d0,d1
  157. X    lea    NoArp(pc),a0
  158. X    move.l    a0,d2
  159. X    moveq    #NoArpEnd-NoArp,d3
  160. X    call    Write
  161. X
  162. X    move.l    a6,a1
  163. X    move.l    4,a6
  164. X    call    CloseLibrary
  165. X
  166. X    bra.s    EFail
  167. X
  168. X;-------------------------------------
  169. X; Arp opened ok, now parse the command line
  170. X; Expects ArpBase in D0
  171. X
  172. XArpOK:    move.l    d0,a6
  173. X    movem.l    (a7)+,a0/d0
  174. X
  175. X    lea    CLIHelp(pc),a1
  176. X    lea    -4(a7),a7
  177. X    move.l    a7,a2
  178. X    lea    CLITemp(pc),a3
  179. X    call    GADS
  180. X    move.l    (a7),a5
  181. X    lea    4(a7),a7
  182. X
  183. X;-------------------------------------
  184. X; Check parameters, write usage if less than one
  185. X; Expects D0 number of paramaters
  186. X
  187. X    tst.l    d0
  188. X    bne.s    ParamOK
  189. X    lea    Usage(pc),a1
  190. X    call    Puts
  191. X    bra.s    EFail
  192. X
  193. X;--------------------------------------------------------------------------
  194. X; Parameters ok, begin to work on them
  195. X; D0: argument count
  196. X; A5: argument vector
  197. X
  198. XParamOK:    move.l    d0,d7
  199. X
  200. X    lea    -JunkSiz(a7),a7
  201. X    move.l    a7,a2
  202. X
  203. X    lea    Junk(pc),a0
  204. X    move.l    a2,a1
  205. X    moveq    #JunkSiz,d0
  206. X    call    Getenv
  207. X
  208. X    tst.b    (a2)
  209. X    bne.s    NoEnv
  210. X
  211. X    lea    Junk(pc),a2
  212. X
  213. XNoEnv:    subq.l    #1,d7
  214. X
  215. X    moveq    #0,d5
  216. X    moveq    #0,d6
  217. X
  218. X    lea    -ScratchSiz(a7),a7
  219. X    move.l    a7,a3
  220. X        
  221. XNextPar:    move.l    #SIGBREAKF_CTRL_C,d1
  222. X    sub.l    a1,a1
  223. X    call    CheckBreak
  224. X    tst.l    d0
  225. X    bne    BreakRcvd
  226. X
  227. X    move.l    (a5)+,a4
  228. X
  229. X;-------------------------------------
  230. X; Check if parameter contains | # ?
  231. X; Expects ¶meter to check in A4, A3 scratch buffer
  232. X
  233. XChk4Pat:    move.l    a4,a1
  234. X;;;    moveq    #0,d1
  235. X1$:    move.b    (a1)+,d0
  236. X    beq.s    NoPattern
  237. X    cmp.b    #'?',d0
  238. X    beq.s    Pattern
  239. X    cmp.b    #'|',d0
  240. X    beq.s    Pattern
  241. X    cmp.b    #'#',d0
  242. X    bne.s    1$
  243. X
  244. X;-------------------------------------
  245. X; Yes, must do pattern matching
  246. X; A4 supplied file name, A3 scratch buffer
  247. X; D6 return code, D5 return value
  248. X
  249. XPattern:    lea    -ap_SIZEOF-256(a7),a7
  250. X
  251. X    move.l    #SIGBREAKF_CTRL_C,ap_BreakBits(a7)
  252. X    move.l    #256,ap_Length(a7)
  253. X
  254. X    move.l    a4,d0
  255. X    move.l    a7,a0
  256. X    call    FindFirst
  257. X1$:    move.l    d0,d6
  258. X    bne.s    NoFiles
  259. X
  260. X    tst.l    d5    
  261. X    bne.s    NoFiles
  262. X
  263. X    lea    ap_SIZEOF(a7),a4
  264. X    bsr.s    Remove
  265. X;;;    tst.l    d0
  266. X    bne.s    2$
  267. X    moveq    #RETURN_FAIL,d5
  268. X
  269. X2$:    move.l    a7,a0
  270. X    call    FindNext
  271. X    bra.s    1$
  272. X
  273. XNoFiles:    tst.l    d6
  274. X    beq.s    1$
  275. X    cmp.w    #ERROR_NO_MORE_ENTRIES,d6
  276. X    beq.s    1$
  277. X    moveq    #RETURN_FAIL,d5
  278. X
  279. X1$:    move.l    a7,a0
  280. X    call    FreeAnchorChain
  281. X    lea    ap_SIZEOF+256(a7),a7
  282. X
  283. X    bra.s    EndLoop
  284. X
  285. X;-------------------------------------
  286. X; No, normal remove will do
  287. X; A4 File name, A3 scratch buffer
  288. X; D5 return value
  289. X
  290. XNoPattern:    bsr.s    Remove
  291. X;;;    tst.l    d0
  292. X    bne.s    EndLoop
  293. X
  294. X    moveq    #RETURN_FAIL,d5
  295. X    move.l    #ERROR_OBJECT_NOT_FOUND,d6
  296. X
  297. XEndLoop:    tst.l    d5
  298. X    dbne.s    d7,NextPar
  299. X
  300. X    lea    ScratchSiz+JunkSiz(a7),a7
  301. X
  302. X;-------------------------------------
  303. X; End this program
  304. X
  305. XExitOK:    moveq    #0,d2
  306. X    move.l    d5,d0
  307. X    beq.s    Exit
  308. X    move.l    d6,d2
  309. XExit:    call    ArpExit
  310. X    rts
  311. X
  312. X;-------------------------------------
  313. X; Break received -- print "***break" and exit program
  314. X; Expects pointer to break string in A1
  315. X
  316. XBreakRcvd:    call    Puts
  317. X    bra.s    ExitOK
  318. X    move.l    #ERROR_BREAK,d2
  319. XExitFail:    moveq    #RETURN_FAIL,d0
  320. X    bra.s    Exit
  321. X
  322. X
  323. XRmRet:    moveq    #0,d0
  324. X    rts
  325. X
  326. X;--------------------------------------------------------------------------
  327. X; Remove a file. 
  328. X; in: A4 = filename to be removed
  329. X;     A3 = 256 bytes scratch buffer area
  330. X;
  331. X; return 0 if failure, <>0 if remove succeeded
  332. X
  333. XRemove:
  334. X
  335. X;-------------------------------------
  336. X; Locate the complete file name
  337. X; Expects A4 filename, A3 scratch area
  338. X
  339. X    move.l    a4,d1
  340. X    move.l    #ACCESS_READ,d2
  341. X    call    Lock
  342. X
  343. X    move.l    d0,d3
  344. X    beq.s    Prnt
  345. X    move.l    a3,a0
  346. X    move.l    #256,d1
  347. X    call    PathName
  348. X
  349. X    move.l    d3,d1
  350. X    call    UnLock
  351. X
  352. X;-------------------------------------
  353. X; Print information
  354. X; Expects A3 full file name
  355. X
  356. XPrnt:    tst.l    d3
  357. X    bne.s    1$
  358. X
  359. X    move.l    a4,-(a7)
  360. X    lea    RemStr(pc),a0
  361. X    move.l    a7,a1
  362. X    call    Printf
  363. X    lea    4(a7),a7
  364. X    lea    Nofile(pc),a1
  365. X    call    Puts
  366. X    bra.s    RmRet
  367. X
  368. X1$:    move.l    a3,-(a7)
  369. X    lea    RemStr(pc),a0
  370. X    move.l    a7,a1
  371. X    call    Printf
  372. X    lea    4(a7),a7
  373. X    
  374. X;-------------------------------------
  375. X; Isolate drive name
  376. X; Expects A3 full file name
  377. X
  378. XIsolate:    move.l    a3,a0
  379. X
  380. X1$:    move.b    (a0)+,d0
  381. X    cmp.b    #':',d0
  382. X    bne.s    1$
  383. X    clr.b    (a0)
  384. X
  385. X;-------------------------------------
  386. X; Build path for rename
  387. X; Expects A2 "junk" dir name, A3 full file name, A4 original file name
  388. X
  389. X    move.l    a3,a0
  390. X    move.l    a2,a1
  391. X    call    TackOn
  392. X    move.l    a4,a0
  393. X    call    BaseName
  394. X    move.l    d0,a1
  395. X    move.l    a3,a0
  396. X    call    TackOn
  397. X
  398. X;-------------------------------------
  399. X; Munch file name so it is unique and doesn't exist
  400. X; Expects A3 full file name to move to
  401. X
  402. X    moveq    #1,d4
  403. XFindEnd:    move.l    a3,a0
  404. X1$:    tst.b    (a0)+
  405. X    bne    1$
  406. X    lea    -1(a0),a0
  407. X    move.l    a0,d3
  408. X    
  409. XChkEx:    move.l    a3,d1
  410. X    move.l    #ACCESS_READ,d2
  411. X    call    Lock
  412. X    move.l    d0,d1
  413. X    beq.s    1$
  414. X    call    UnLock
  415. X
  416. X    movem.l    a2/a3/a6,-(a7)
  417. X    lea    FileFmt(pc),a0    ; Format string
  418. X    move.l    d4,-(a7)
  419. X    addq.l    #1,d4
  420. X    move.l    a7,a1        ; Output values
  421. X    move.l    d3,a3        ; Output buffer
  422. X    move.l    4,a6
  423. X    lea    StuffChar(pc),a2
  424. X    call    RawDoFmt
  425. X    lea    4(a7),a7
  426. X    movem.l    (a7)+,a2/a3/a6
  427. X
  428. X    bra.s    ChkEx
  429. X
  430. X;-------------------------------------
  431. X; Now rename the file
  432. X; Expects A3 new, unique junk file name, A4 original file name
  433. X
  434. X1$:    move.l    a4,d1
  435. X    move.l    a3,d2
  436. XRen:    call    Rename
  437. X    move.l    d0,d3
  438. X    beq.s    1$
  439. X    lea    Success(pc),a1
  440. X    bra.s    2$
  441. X1$:    lea    Failed(pc),a1
  442. X2$:    call    Puts
  443. X
  444. X    move.l    d3,d0
  445. X    rts
  446. X
  447. X;-------------------------------------
  448. X; StuffChar, used for Sprintf style formatting
  449. X
  450. XStuffChar:    move.b    d0,(a3)+
  451. X    rts
  452. X
  453. X;-------------------------------------
  454. X;-------------------------------------
  455. X
  456. XRemStr:    dc.b 'Removing %s...',0
  457. XFileFmt:    dc.b ';%ld',0
  458. XSuccess:    dc.b 'done',0
  459. XFailed:    dc.b 'failed',0
  460. XNofile:    dc.b 'not found',0
  461. X
  462. XJunk:    dc.b 'Junk',0
  463. XCLITemp:    dc.b 'FILES/'
  464. XThink:    dc.b '...',0
  465. XCLIHelp:    dc.b 'Files to remove',0
  466. XUsage:    dc.b 'Usage: rm <file> ...',0
  467. XDosN:    dc.b 'dos.library',0
  468. XArpN:    ArpName
  469. XNoArp:    dc.b 'You need arp.library V34+'
  470. XNoArpEnd:
  471. XTestByte:    dc.b $a
  472. X
  473. X    end
  474. END_OF_FILE
  475. if test 6702 -ne `wc -c <'rm.asm'`; then
  476.     echo shar: \"'rm.asm'\" unpacked with wrong size!
  477. fi
  478. # end of 'rm.asm'
  479. fi
  480. if test -f 'rm.doc' -a "${1}" != "-c" ; then 
  481.   echo shar: Will not clobber existing file \"'rm.doc'\"
  482. else
  483. echo shar: Extracting \"'rm.doc'\" \(8065 characters\)
  484. sed "s/^X//" >'rm.doc' <<'END_OF_FILE'
  485. X
  486. X
  487. X     Page 1                 RM's Documentation                  Page 1
  488. X
  489. X
  490. X
  491. X
  492. X
  493. X
  494. X
  495. X
  496. X
  497. X
  498. X
  499. X
  500. X
  501. X
  502. X
  503. X
  504. X
  505. X                                    RM
  506. X                   (c) Copyright 1989 by Martin J. Laubach
  507. X                            All rights reserved
  508. X
  509. X
  510. X
  511. X
  512. X
  513. X
  514. X
  515. X
  516. X  1. Introduction      
  517. X
  518. X       It happened again. Just now. You wanted to delete a couple of
  519. X     files, and one tiny extra space crept in. The result -- "delete
  520. X     t: #?", was devastating. A week's work is gone.  
  521. X
  522. X       That's where rm comes in. Instead of immediately deleting the
  523. X     files, they will be moved to some trash directory. When you are
  524. X     sure everything is OK (after some minutes when everything has
  525. X     settled), you can empty it (at my place this automatically
  526. X     happens once a day -- files older than 24 hours are then
  527. X     erased).  
  528. X
  529. X
  530. X  2. How to     
  531. X
  532. X       You will have to create a directory called "Junk" (or
  533. X     something else, see below for more on that subject) that will
  534. X     temporarily hold the rm'ed files, in the root of each volume you
  535. X     intend to use rm on -- ie. for each partition on your hard
  536. X     drive, if your partitions are called DH0: and DH1:, you need
  537. X     "DH0:Junk", "DH1:Junk".  
  538. X
  539. X       Now, when you are rm'ing a file, it is not immediately
  540. X     physically erased, but rather moved to that "Junk" directory.
  541. X     Now, should you discover you just (accidentially, of course)
  542. X     rm'ed some important file, all you have to do to recover it is
  543. X     to go to the Junk directory, and move or copy the file back.  
  544. X
  545. X
  546. X     How to
  547. X
  548. X
  549. X     Page 2                 RM's Documentation                  Page 2
  550. X
  551. X
  552. X
  553. X       Rm, of course, supports wildcards. "Rm #?" will delete
  554. X     everything in your local directory (including directories and
  555. X     "busy" files). "Rm #?.o" will remove all object modules --
  556. X     please see your AmigaDOS manual for more information on
  557. X     wildcards.  
  558. X
  559. X       You may also give it more than one parameter: "rm foo bar baz"
  560. X     will attempt to remove the files or directories called foo, bar
  561. X     and baz (in that order). If one of the removals fails, the whole
  562. X     operation is aborted with an appropriate error message.  
  563. X
  564. X
  565. X       Once you really are sure you haven't removed anything lethal
  566. X     (typically the next day), you can really (physically) delete the
  567. X     files. The enclosed "purge" script, which needs the arp shell
  568. X     and ARexx to run (one could do without ARexx -- it's just bells
  569. X     and whistles), goes through each existing junk directory and
  570. X     does such a delete.  
  571. X
  572. X
  573. X  3. Goodies      
  574. X
  575. X       And finally -- two more bonus points: First, rm is very short
  576. X     (752 bytes in the current version). That's for the people with
  577. X     the very-full-c-directory-mania. And second, rm is completely
  578. X     reentrant and can be made resident (e.g. with ARes). That's for
  579. X     the people with the strange I-still-have-two-megs-left feeling.  
  580. X
  581. X
  582. X  3.1. Bells    
  583. X
  584. X       Since I hate iron cast (read hard coded) definitions, you are
  585. X     of course not limited calling the directory "Junk" -- it's just
  586. X     the default name.  Should you want to use your WorkBench
  587. X     "TrashCan" directory, "T", or anything else, here is how to do
  588. X     so. Using environment variables, you can assign the trash
  589. X     directory to whatever name you want. All you have to do is a
  590. X     "Set JUNK MyDir" (e.g. in the startup-sequence), and the rm'ed
  591. X     files will go into ":MyDir" instead.  
  592. X
  593. X
  594. X  3.2. Whistles    
  595. X
  596. X       Another nice feature of rm is that it allows multiple versions
  597. X     of files.  Suppose you just rm'ed "Foo:Foo", and you now remove
  598. X     "Bar:Foo" -- rm won't overwrite the first version with the
  599. X     second (and thus effectively deleting the first), but keep it
  600. X     and add a version number to each same file that is deleted. The
  601. X     first time you remove "Foo", it will be moved to ":Junk/Foo".
  602. X     Each following removal of a file called "Foo" results in
  603. X     ":Junk/Foo;1", ":Junk/Foo;2" and so on.  
  604. X
  605. X
  606. X
  607. X
  608. X     Goodies                                               Whistles
  609. X
  610. X
  611. X     Page 3                 RM's Documentation                  Page 3
  612. X
  613. X
  614. X  4. Caveats      
  615. X
  616. X       Rm needs the "arp.library", version 39 or higher to run.  
  617. X
  618. X       Since the files aren't physically removed, you will need some
  619. X     free space on each volume -- just rm'ing files won't give you
  620. X     more space on a 99% full drive. You will have to purge the trash
  621. X     directories.  
  622. X
  623. X       The junk directory must reside on the current volume -- since
  624. X     it is not possible to rename files across volumes, that means
  625. X     that every partition of your harddisk must have such a junk
  626. X     directory.  
  627. X
  628. X       Also, I can't really imagine using this tool on a floppy-only
  629. X     system.  
  630. X
  631. X       You shouldn't let the Junk directory grow too large --
  632. X     especially when there are many versions of a file, rm will take
  633. X     longer and longer. It's probably not a good idea to keep "Bar"
  634. X     to "Bar;999", as now "rm Bar" will take rather long to execute.  
  635. X
  636. X
  637. X  5. What      
  638. X
  639. X       In this archive, you should find the following files: 
  640. X
  641. X             rm.doc .... What you are reading right now.
  642. X             rm.asm .... The source for rm.
  643. X             makefile .. Guess what.
  644. X             rm ........ The executable
  645. X             purge ..... A script to purge the junk directory
  646. X
  647. X
  648. X  6. Where      
  649. X
  650. X       If you have any comments, ideas what could or should be
  651. X     improved, bug reports or just like to chat a bit, please feel
  652. X     free to contact me at one of the following addresses... I just
  653. X     *love* receiving mail! 
  654. X
  655. X       Usenet:  mjl@alison.at 
  656. X                ..!uunet!mcsun!tuvie!alison!mjl 
  657. X
  658. X         or 
  659. X
  660. X       FidoNet: "Martin Laubach" at 2:310/3.14 
  661. X
  662. X
  663. X       Looking forward to reading from you, 
  664. X
  665. X             mjl 
  666. X
  667. X
  668. X
  669. X
  670. X     Where
  671. X
  672. X
  673. X     Page 4                 RM's Documentation                  Page 4
  674. X
  675. X
  676. X
  677. X  7. License      
  678. X
  679. X       This material is (c) Copyright 1989 by Martin J. Laubach -- All
  680. X     rights reserved.  
  681. X
  682. X       It may be distributed freely as long as the following
  683. X     restrictions are met: 
  684. X
  685. X       The distributor may charge a fee to recover distribution
  686. X     costs. The fee for diskette distribution should not be more than
  687. X     the cost to obtain the same diskette from Fred Fish.  
  688. X
  689. X       The distributor agrees to cease distributing the programs and
  690. X     data involved if requested to do so by the author.  
  691. X
  692. X       You may copy and distribute verbatim copies of the program's
  693. X     executable code and documentation as you receive it, in any
  694. X     medium, provided that you conspicuously and appropriately
  695. X     publish only the original, unmodified program, with all
  696. X     copyright notices and disclaimers of warranty intact and
  697. X     including all the accompanying documentation, example files and
  698. X     anything else that came with the original.  
  699. X
  700. X       The author will not be liable for any damage arising from the
  701. X     failure of this program to perform as described, or any
  702. X     destruction of other programs or data residing on a system
  703. X     attempting to run the program.  While I know of no damaging
  704. X     errors, the user of this program uses it at his or her own
  705. X     risk.  
  706. X
  707. X
  708. X
  709. X
  710. X
  711. X
  712. X
  713. X
  714. X
  715. X
  716. X
  717. X
  718. X
  719. X
  720. X
  721. X
  722. X
  723. X
  724. X
  725. X
  726. X
  727. X
  728. X
  729. X
  730. X
  731. X
  732. X     License
  733. X
  734. X
  735. X     Page 5                 RM's Documentation                  Page 5
  736. X
  737. X
  738. X  8. Road Map    
  739. X
  740. X
  741. X
  742. X        1. Introduction     ....................................    1
  743. X        2. How to    ...........................................    1
  744. X        3. Goodies     .........................................    2
  745. X           3.1. Bells   ........................................    2
  746. X           3.2. Whistles   .....................................    2
  747. X        4. Caveats     .........................................    2
  748. X        5. What     ............................................    3
  749. X        6. Where     ...........................................    3
  750. X        7. License     .........................................    4
  751. X        8. Road Map    .........................................    5
  752. X
  753. X
  754. X
  755. X
  756. X
  757. X
  758. X
  759. X
  760. X
  761. X
  762. X
  763. X
  764. X
  765. X
  766. X
  767. X
  768. X
  769. X
  770. X
  771. X
  772. X
  773. X
  774. X
  775. X
  776. X
  777. X
  778. X
  779. X
  780. X
  781. X
  782. X
  783. X
  784. X
  785. X
  786. X
  787. X
  788. X
  789. X
  790. X
  791. X
  792. X
  793. X
  794. X     Road Map
  795. X
  796. END_OF_FILE
  797. if test 8065 -ne `wc -c <'rm.doc'`; then
  798.     echo shar: \"'rm.doc'\" unpacked with wrong size!
  799. fi
  800. # end of 'rm.doc'
  801. fi
  802. if test -f 'rm.uu' -a "${1}" != "-c" ; then 
  803.   echo shar: Will not clobber existing file \"'rm.uu'\"
  804. else
  805. echo shar: Extracting \"'rm.uu'\" \(1084 characters\)
  806. sed "s/^X//" >'rm.uu' <<'END_OF_FILE'
  807. Xbegin 664 rm
  808. XM```#\P`````````!``````````````"S```#Z0```+-@"DK\```+N`````!($
  809. XMYX"`+'@`!$/Z`I!P(DZN_=A*@&9(0_H"=G`B3J[]V$J`9AI(YP$&+CP``X`'%
  810. XM+'@`!$ZN_Y1,WV"`<!1.=2Q`3J[_Q"(`0?H"7B0(=AE.KO_0(DXL>``$3J[^)
  811. XM8F#<+$!,WP$!0_H"`T_O__PD3T?Z`>].KO\$*E=8CTJ`9@I#^@'Y3J[_$&"R+
  812. XM+@!/[_^P)$]!^@'((DIP4$ZN_N9*$F8$1?H!N%.'>@!\`$_O_P`F3R(\```0,
  813. XM`)/)3J[^[$J`9@``CBA=(DP0&6=@#```/V<,#```?&<&#```(V;J3^_]Z"]\C
  814. XM```0```(+WP```$``!`@#"!/3J[^2BP`9A9*A6822>\!&&%<9@)Z%"!/3J[^/
  815. XM1&#F2H9G"`Q&`.AG`GH4($].KOX^3^\"&&`,839F"'H4+#P```#-2H56S_]V6
  816. XM3^\!4'0`(`5G`B0&3J[^ADYU3J[_$&#L)#P```$P<!1@ZG``3G4B#'3^3J[_"
  817. XMK"8`9Q(@2R(\```!`$ZN_K8B`TZN_Z9*@V88+PQ!^@"H(D].KO\<6(]#^@"\<
  818. XM3J[_$&#"+PM!^@"0(D].KO\<6(\@2Q`8#```.F;X0A`@2R)*3J[]D"!,3J[]O
  819. XMBB)`($M.KOV0>`$@2TH89OQ!Z/__)@@B"W3^3J[_K"(`9RA.KO^F2.<`,D'Z1
  820. XM`$\O!%*$(D\F0RQX``1%^@`L3J[]]EB/3-],`&#,(@PD"TZN_[(F`&<&0_H`8
  821. XM*&`$0_H`)TZN_Q`@`TYU%L!.=5)E;6]V:6YG("5S+BXN`#LE;&0`9&]N90!F_
  822. XM86EL960`;F]T(&9O=6YD`$IU;FL`1DE,15,O+BXN`$9I;&5S('1O(')E;6]V/
  823. XM90!5<V%G93H@<FT@/&9I;&4^("XN+@!D;W,N;&EB<F%R>0!A<G`N;&EB<F%R-
  824. X@>0!9;W4@;F5E9"!A<G`N;&EB<F%R>2!6,S0K"@```_)RQ
  825. X``
  826. Xend
  827. Xsize 752
  828. END_OF_FILE
  829. if test 1084 -ne `wc -c <'rm.uu'`; then
  830.     echo shar: \"'rm.uu'\" unpacked with wrong size!
  831. fi
  832. # end of 'rm.uu'
  833. fi
  834. echo shar: End of archive 1 \(of 1\).
  835. cp /dev/null ark1isdone
  836. MISSING=""
  837. for I in 1 ; do
  838.     if test ! -f ark${I}isdone ; then
  839.     MISSING="${MISSING} ${I}"
  840.     fi
  841. done
  842. if test "${MISSING}" = "" ; then
  843.     echo You have the archive.
  844.     rm -f ark[1-9]isdone
  845. else
  846.     echo You still need to unpack the following archives:
  847.     echo "        " ${MISSING}
  848. fi
  849. ##  End of shell archive.
  850. exit 0
  851. -- 
  852. Submissions to comp.sources.amiga and comp.binaries.amiga should be sent to:
  853.     amiga@cs.odu.edu    
  854. or    amiga@xanth.cs.odu.edu    ( obsolescent mailers may need this address )
  855. or    ...!uunet!xanth!amiga    ( very obsolescent mailers need this address )
  856.  
  857. Comments, questions, and suggestions s should be addressed to ``amiga-request''
  858. (only use ``amiga'' for submissions) at the above addresses.
  859.